【BigQuery アップデート情報】トランザクション内でのTRUNCATE TABLEがGAになりました
2023年6月21日のアップデートでトランザクション内でのTRUNCATE TABLEが正式にサポートされるようになりました。
The following statement types are supported in transactions: ・ DML statements: INSERT, UPDATE, DELETE, MERGE, and TRUNCATE TABLE
Statements supported in transactions
このアップデートの何が嬉しいのか
今回アップデートにより、トランザクションを使った全データの洗い替えが効率的かつ安価にできるようになった
と思います。
- 従来のトランザクションを使った全データの洗い替え
BEGIN BEGIN TRANSACTION; DELETE FROM test.wikipedia WHERE TRUE; INSERT test.wikipedia SELECT * FROM samples_dataset.wikipedia; COMMIT TRANSACTION; END;
- 今回のアップデートでできるようになったこと
BEGIN BEGIN TRANSACTION; TRUNCATE TABLE test.wikipedia; INSERT test.wikipedia SELECT * FROM samples_dataset.wikipedia; COMMIT TRANSACTION; END;
具体的にこれができるようになって何が嬉しいのか見ていきましょう。
そもそもTRUNCATE TABLEとは
TRUNCATE TABLEは、DDLの1つでテーブルからすべての行を削除することができます。しかし、テーブルのスキーマ、説明、ラベルなどのメタデータはそのまま残ります。
TRUNCATEとDROPとDELETEの違い
TRUNCATEとよく比較される対象にDROPとDELETEがあります。それぞれの違いを見てみましょう。
削除の対象 | 削除後 | BQのスキャン量 | 削除速度 | |
---|---|---|---|---|
TRUNCATE | 全てのデータ | 各種メタデータ | 0 | 瞬時 |
DROP | 全てのデータ | 何も残らない | 0 | 瞬時 |
DELETE | WHERE句で指定可能 | 残ったデータ + 各種メタデータ | テーブルのデータ量に依存 | テーブルのデータ量に依存 |
上記の表のようにTRUNCATEは、各種メタデータを残しながら全てのデータを瞬時 & 安価に削除することが可能です。
利用ケースとして、TRUNCATE + INSERT
でテーブルの洗い替えを効率良く行うことが可能です。
TRUNCATEの使い方
TRUNCATE構文は非常にシンプルで以下のようなクエリになります。
TRUNCATE TABLE `project_name.dataset_name.table_name`
注意点としてビューやマテリアライズドビュー、外部テーブルは削除することができません。
結局何が嬉しいのか
全データを洗い替えする場合、最初に紹介したクエリのようにTRUNCATEがトランザクションに対応する前はDELETEで全件削除し、INSERTでデータを追加する必要がありました。
DELETE FROM test.wikipedia WHERE TRUE; INSERT test.wikipedia SELECT * FROM samples_dataset.wikipedia;
しかし、前述した通り、DELETEはスキャン料金がかかり、削除するのにも多少時間がかかるデメリットがありましたが、TRUNCATEはこのようなデメリットは一切ありません。
よって今後は、全データ洗い替えする場合はTRUNCATEで一部データを洗い替えする場合は引き続きDELETEで使い分けをすると良いと思われます。